SQL参数化查询的另一个理由 命中执行计划
5总结
SELECT cp.usecounts AS '使用次数'
SQL语言的本质就是一串伪代码,表达的是做什么,而不是怎么做的意思。如其它语言一样,SQL语句需要编译之后才能运行,所以每一条SQL是需要通过编译器解释才能运行的(在这之间还要做SQL的优化)。而这些步骤都是需要运行成本,所以在数据库中有一个叫做执行计划的东西,编译器会将编译过后的SQL存入执行计划当中,当遇到同样的SQL时,就直接调用执行计划来执行,而不需要再次编译。

可以看到这个计划的重用次数为2,即这个计划被重用了;
总的来说,SQL语句在执行时,会生成执行计划并将它缓存起来,我们可以通过提高使用缓存中的执行计划次数,来减少数据库的压力。而使用参数化的SQL是一个很好的选择,参数化查询的作用不仅只有防止SQL注入,还可以提高缓存中执行计划使用次数。
DECLARE @I INT=0,@ENDI INT=1000;
2相关SQL
INSERT dbo.Employee(id,name) VALUES(@I,'蒋大华'+CAST(@I AS NVARCHAR(20)));
SQLHelper.ExecuteNonQuery(SQLHelper.DefaulConnectiontString, System.Data.CommandType.Text, selectCmdText, null);
string selectCmdText = string.Format(@"SELECT * FROM Employee WHERE",” 蒋大华1”);
复制代码 代码如下:
2.3测试脚本(创建员工表,并向其插入1000条数据)DBCC FREEPROCCACHE
SqlParameter[] param = { new SqlParameter("@name", txtEmployeeName.Text.Trim()) };
然后再执行下面的代码(查询的条件变了)
,plan_handle AS '计划句柄'
DROP TABLE [dbo].Employee
WHILE(@I<@ENDI)
3测试执行计划
复制代码 代码如下:
,objtype AS '类型'id int,
--人员表
只需要一个准备SQL,然后,输入不同的参数,并执行,再查看执行计划
查看执行计划: );SQLHelper.ExecuteNonQuery(SQLHelper.DefaulConnectiontString, System.Data.CommandType.Text, selectCmdText, null);
,st.[text] AS 'SQL文本'
复制代码 代码如下:
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stSET @I+=1;
1概述
4.2 参数化SQL
查看执行计划
WHERE st.text not like '%sys%'
结果又新添加一个执行计划,即SQL SERVER认为这是两个不同的SQL语句并分别建立了执行计划;
通过对上面执行计划的认识,为了提高数据库运行的效率,我们需要尽可能的命中执行计划,这样就可以节省运行时间。3.3 修改SQL:SELECT * FROM Employee(在SELECT后多加一个空格),执行并查看执行计划
3.1 先执行删除所有执行计划,然后执行SELECT * FROM Employee ,最后查看执行计划(2.1中的查看执行计划脚本)如下图
复制代码 代码如下:
SQLHelper.ExecuteNonQuery(SQLHelper.DefaulConnectiontString, System.Data.CommandType.Text, selectCmdText, param);
CREATE TABLE dbo.Employee
重用执行计划,perfect...
输入参数并执行,然后查看执行计划:
END;
3.2 再运行一次SQL: SELECT * FROM Employee,并查看执行计划
2.2删除执行计划
2.1查看当前数据库中所有的执行计划:
4重用执行计划——使用参数化查询方法
FROM sys.dm_exec_cached_plans cpstring selectCmdText = string.Format(@"SELECT * FROM Employee WHERE",” 蒋大华2”);
即当执行一个未参数化SQL时,SQL SERVER需要先将其转换成一个参数SQL并执行它。一共需要两执行计划
4.1 未参数化SQL
复制代码 代码如下:
复制代码 代码如下:
BEGIN--删除所有计划

此时不需要再准备一个准备的SQL,但还是需要再产生一个执行计划,并缓存下来;
string selectCmdText = string.Format(@"SELECT * FROM Employee WHERE name=@name");即SQL SERVER会为每一条SQL建立一个执行计划,并将它缓存起来
name nvarchar(50)--插入测试数据

相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/sql/mssql/2044.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
SQL基本教程之行转列Pivo
时间:2021-01-20
-
region from hr.Employees union
时间:2021-01-20
-
有时候需要调整用户权限
时间:2021-01-19
-
(但使用 ORDER BY 子句并不
时间:2021-01-19
-
RAND()*10000)insert into Detail
时间:2021-01-19
-
OR 运算符:在两侧的查询
时间:2021-01-19
-
放假之前老大跟我提起了
时间:2021-01-19
-
数据库的运维计策剧本篇
时间:2021-01-19
热门文章
-
4.与聚合函数和 GROUP BY 子句有关的常见错
时间:2021-01-19
-
SQL Server安全(11/11):审核(Auditing)
时间:2021-01-09
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
